
package edu.uoc.tdp.pac4.cliente;

/**
 *
 * @author pguerreroj
 */
import edu.uoc.tdp.pac4.beans.Usuari;
import edu.uoc.tdp.pac4.comun.GestorInterface;
import edu.uoc.tdp.pac4.comun.GestorConexionInterface;
import edu.uoc.tdp.pac4.conexion.GestionConexionLogin;
import edu.uoc.tdp.pac4.conexion.GestionConexionListUsuarios;
import edu.uoc.tdp.pac4.conexion.GestionConexionListTalleres;
import edu.uoc.tdp.pac4.comun.Utils;
import edu.uoc.tdp.pac4.i18n.TDSLanguageUtils;
import edu.uoc.tdp.pac4.repara.GestionReparacionesCapTaller;
import edu.uoc.tdp.pac4.repara.GestionReparacionesMecanic;
import edu.uoc.tdp.pac4.admn.GestionCliente;
import edu.uoc.tdp.pac4.admn.GestionSolicitud;
import edu.uoc.tdp.pac4.admn.GestionStock;
import edu.uoc.tdp.pac4.comun.Enumerados.PerfilEnum;
import edu.uoc.tdp.pac4.comun.GestorAdministrativaInterface;
import edu.uoc.tdp.pac4.comun.PAC4Exception;
import edu.uoc.tdp.pac4.repara.GestionAprobacionSolicitudes;
import edu.uoc.tdp.pac4.reports.estadisticas;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyVetoException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.ArrayList;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import javax.swing.JLabel;
import java.sql.SQLException;




public final class Principal extends JFrame{
  
    public static JDesktopPane escritorio;
    private GestorInterface conexion;
    private GestorConexionInterface conexionConexion;
    private GestorAdministrativaInterface conexionAdministrativa; 
    private final String URL = "localhost";
    private final String JNDI_NAME ="CATL";
    private final int PORT = 1099;
    //todo: roberto. test control pantallas abiertas
    private ArrayList<JInternalFrame> SubPantallas;
    public static Usuari currentUser = new Usuari();
    
    GestionCliente gestionCliente;
    GestionSolicitud gestionSolicitud;
    GestionStock gestionStock;

    private static JMenu administrativa, opciones, reparaciones, mantenimiento;
    private static JMenuBar barra;
    private static JMenuItem clientes, solicitud, piezas, opciones1, opciones2, reparaciones0, reparaciones1, reparaciones2, users, talleres;
    
    public Principal() {
		
        seleccionDeIdioma();
        initComponents();
        
    }
    
    private void seleccionDeIdioma() {
        Locale localLocale = new Locale("es", "ES");
        TDSLanguageUtils.setDefaultLanguage("i18n/messages");
    }
    
    public void initComponents(){
        
        
        SubPantallas= new ArrayList<JInternalFrame>() {};
        
        this.setTitle(TDSLanguageUtils.getMessage("Principal.title"));
        
        JFrame v = new JFrame("Prueba JInternalFrame");
        
        escritorio=new JDesktopPane();
        add(escritorio);
        
        // Barra
        barra=new JMenuBar();
        
        
        // Menú principal Inicio
        JMenu inicio=new JMenu(TDSLanguageUtils.getMessage("Principal.JmenuGestor"));
    
        // Menú principal 
        
        mantenimiento=new JMenu("Mantenimiento");
        
        administrativa =new JMenu("Gestión administrativa");
        
        // Menú Login
        JMenuItem login = new JMenuItem("Validarse");
        login.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                conectarRMIConexion();
                setContentInternalFrame(new GestionConexionLogin(conexionConexion),TDSLanguageUtils.getMessage("Principal.JmenuReparaGestionEspera"));
            
            }
        });        

        
        
        
        // Menú Inicio > Conectar con su listener
        JMenuItem conectar=new JMenuItem(TDSLanguageUtils.getMessage("Principal.JmenuConectar"));
        conectar.addActionListener(new ActionListener() {
          
            @Override
            public void actionPerformed(ActionEvent arg0) {
                 conectarServerRMI();
            }
        });        
        
        
        // Menú Inicio >  Salir con su listener
        
        JMenuItem inicio2=new JMenuItem(TDSLanguageUtils.getMessage("Principal.JmenuSalir"));
        inicio2.addActionListener(new ActionListener() {
          
            @Override
            public void actionPerformed(ActionEvent arg0) {
                 int respuesta = JOptionPane.showConfirmDialog(null,TDSLanguageUtils.getMessage("Principal.Salir"),"Alerta",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);
                 if (respuesta == 0) {  
                     System.exit(0);
                 }  
            }
        });
        
        
        // Menú Opciones
        opciones=new JMenu(TDSLanguageUtils.getMessage("Principal.JmenuGestor2"));
        
        // Menú Opcions > Consultar precions proveedor con listener 
        opciones1=new JMenuItem(TDSLanguageUtils.getMessage("Principal.JmenuConsulta"));
        opciones1.addActionListener(new ActionListener() {
          
            @Override
            public void actionPerformed(ActionEvent arg0) {
                 setContentInternalFrame(new ConsultaPreus(),TDSLanguageUtils.getMessage("Principal.JmenuConsulta"));
            }
        });
        
        // Menú Opciones > Cálculo de presupuestos en la compra de piezas con listener
        opciones2=new JMenuItem(TDSLanguageUtils.getMessage("Principal.JmenuPresupuesto"));
        opciones2.addActionListener(new ActionListener() {
          
            @Override
            public void actionPerformed(ActionEvent arg0) {
                setContentInternalFrame(new Pressupost(),TDSLanguageUtils.getMessage("Principal.JmenuPresupuesto"));
                
            }
        });
        
        //* NO activos */
        reparaciones=new JMenu(TDSLanguageUtils.getMessage("Principal.JmenuReparaciones"));
        reparaciones0=new JMenuItem(TDSLanguageUtils.getMessage("Principal.JmenuReparaGestionSolicitudes"));
        reparaciones0.addActionListener(new ActionListener() {
          
            @Override
            public void actionPerformed(ActionEvent arg0) {
                try {
                    setContentInternalFrame(new GestionAprobacionSolicitudes(),TDSLanguageUtils.getMessage("Principal.JmenuReparaGestionSolicitudes"));
                } catch (PAC4Exception ex) {
                    Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
                }
                
            }
        });
        reparaciones1=new JMenuItem(TDSLanguageUtils.getMessage("Principal.JmenuReparaGestionEspera"));
        reparaciones1.addActionListener(new ActionListener() {
          
            @Override
            public void actionPerformed(ActionEvent arg0) {
                try {
                    setContentInternalFrame(new GestionReparacionesMecanic(),TDSLanguageUtils.getMessage("Principal.JmenuReparaGestionEspera"));
                } catch (PAC4Exception ex) {
                    Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
                }
                
            }
        });
        reparaciones2=new JMenuItem(TDSLanguageUtils.getMessage("Principal.JmenuReparaGestionReparaciones"));
        reparaciones2.addActionListener(new ActionListener() {
          
            @Override
            public void actionPerformed(ActionEvent arg0) {
                try {
                    setContentInternalFrame(new GestionReparacionesCapTaller(),TDSLanguageUtils.getMessage("Principal.JmenuReparaGestionReparaciones"));
                } catch (PAC4Exception ex) {
                    Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
                }
                
            }
        });
        
        
         // Menú Mantenimiento Usuarios
        users = new JMenuItem("Mantenimiento de usuarios");
        users.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                conectarRMIConexion();
                setContentInternalFrame(new GestionConexionListUsuarios(conexionConexion),TDSLanguageUtils.getMessage("Principal.JmenuReparaGestionEspera"));
            
            }
        });     
        
         // Menú Mantenimiento de talleres
        talleres = new JMenuItem("Mantenimiento de talleres");
        talleres.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                conectarRMIConexion();
                setContentInternalFrame(new GestionConexionListTalleres(conexionConexion),"Talleres");
            
            }
        });     

        // Menú Gestión administrativa Cliente
        clientes = new JMenuItem(TDSLanguageUtils.getMessage("Admin.Cliente.Titulo"));
        clientes.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                if(gestionCliente == null || gestionCliente.isClosed()) {
                    gestionCliente = new GestionCliente(conexionAdministrativa);
                    setContentInternalFrame(gestionCliente, TDSLanguageUtils.getMessage("Admin.Cliente.Titulo"));
                }
                try {
                    gestionCliente.setSelected(true);
                } catch (PropertyVetoException ex) {
                    Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
                }
                escritorio.setSelectedFrame(gestionCliente);
            }
        });     
        
        // Menú Gestión administrativa Solicitud
        solicitud = new JMenuItem(TDSLanguageUtils.getMessage("Admin.Solicitud.Titulo"));
        solicitud.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                if(gestionSolicitud == null || gestionSolicitud.isClosed()) {
                    gestionSolicitud = new GestionSolicitud(conexionAdministrativa);
                    setContentInternalFrame(gestionSolicitud, TDSLanguageUtils.getMessage("Admin.Solicitud.Titulo"));
                }
                try {
                    gestionSolicitud.setSelected(true);
                } catch (PropertyVetoException ex) {
                    Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
                }
                escritorio.setSelectedFrame(gestionSolicitud);
            }
        });
        
        // Menú Gestión administrativa Stock
        piezas = new JMenuItem(TDSLanguageUtils.getMessage("Admin.Stock.Titulo"));
        piezas.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                if(gestionStock == null || gestionStock.isClosed()) {
                    gestionStock = new GestionStock(conexionAdministrativa);
                    
                    setContentInternalFrame(gestionStock, TDSLanguageUtils.getMessage("Admin.Stock.Titulo"));
                }
                try {
                    gestionStock.setSelected(true);
                } catch (PropertyVetoException ex) {
                    Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
                }
                escritorio.setSelectedFrame(gestionStock);                
            }
        }); 
        
        // Añadimos los elementos
        
        // Menú Inicio
        inicio.add(login);
       // inicio.add(conectar);
        inicio.add(inicio2);
        barra.add(inicio);
        
        setJMenuBar(barra);
      
    }
    
    public static void setMenu() {
        // Menú opciones
        opciones.add(opciones1);
        opciones.add(opciones2);
        barra.add(opciones);
        
        // Menú Reparaciones
        if(currentUser.getID() >0) {
            if(currentUser.getPerfil().getId() == PerfilEnum.ADMINISTRADOR.getPerfil() ||
               currentUser.getPerfil().getId() == PerfilEnum.JEFE_TALLER.getPerfil()) {
        reparaciones.add(reparaciones0);
        reparaciones.add(reparaciones2);
            }
            else  if(currentUser.getPerfil().getId() == PerfilEnum.ADMINISTRADOR.getPerfil() ||
               currentUser.getPerfil().getId() == PerfilEnum.MECANICO.getPerfil()) {
        
        reparaciones.add(reparaciones1);
            }
        if(currentUser.getPerfil().getId() == PerfilEnum.ADMINISTRADOR.getPerfil() ||
               currentUser.getPerfil().getId() == PerfilEnum.JEFE_TALLER.getPerfil()||
               currentUser.getPerfil().getId() == PerfilEnum.MECANICO.getPerfil()) 
        barra.add(reparaciones);
        }
        // Menú mantenimiento
        mantenimiento.add(users);
        mantenimiento.add(talleres);
        barra.add(mantenimiento);
        
        //Menú Gestión administrativa
        if(currentUser.getID() >0) {
            if(currentUser.getPerfil().getId() == PerfilEnum.ADMINISTRADOR.getPerfil() ||
               currentUser.getPerfil().getId() == PerfilEnum.ADMINISTRATIVO.getPerfil()) {
                administrativa.add(clientes);
                administrativa.add(solicitud);
                administrativa.add(piezas);
            } 
            else if (currentUser.getPerfil().getId() == PerfilEnum.JEFE_TALLER.getPerfil()) {
                administrativa.add(piezas);
            }
         
            if(currentUser.getPerfil().getId() == PerfilEnum.ADMINISTRADOR.getPerfil() ||
               currentUser.getPerfil().getId() == PerfilEnum.ADMINISTRATIVO.getPerfil() ||
               currentUser.getPerfil().getId() == PerfilEnum.JEFE_TALLER.getPerfil()) {
                barra.add(administrativa);
            }
        }
    }
    
    public static void setContentInternalFrame(JInternalFrame pantalla, String title) {
        
        
       /* JLabel l = new JLabel("AAAAAAA");
        l.setBounds(100,100, 100,40);
        l.setText("Hola campeon");
        */
        
        /*todo:  pendiente Control de pantallas*/
        //String classpant=pantalla.getClass().toString();
       // boolean encontrado=false;
       // for (int i = 0; i < SubPantallas.size(); i++) {
            
       //     if(SubPantallas.get(i).getClass().toString().equals(classpant))
        //    {    encontrado=true;
        //         break;
        //    }
       // }
          // if(!encontrado)
           // {
              //  SubPantallas.add(pantalla);
            //pantalla.setBounds(0, 0, 550, 400);
                escritorio.add(pantalla); 
            
            //gr.setMaximizable(true);
            try {
                pantalla.setMaximum(true);
            } catch (PropertyVetoException ex) {
                Logger.getLogger(Principal.class.getName()).log(Level.SEVERE, null, ex);
            }
            pantalla.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
            pantalla.setResizable(true);
            pantalla.setClosable(true);
            pantalla.setIconifiable(true);
            pantalla.setMaximizable(true);
            // Se visualiza todo.
            //pantalla.setSize(600,350);
            pantalla.setVisible(true);
            pantalla.show();
            pantalla.setTitle(title);
            //}
           // escritorio.setSelectedFrame(pantalla);  
           // escritorio.repaint();
            
            
            
     }
    
    
    public void conectarRMIConexion() {
        String JNDI_NAME ="Serv_Conexion";
        try {
            Registry registry = LocateRegistry.getRegistry(URL,PORT);
            conexionConexion = (GestorConexionInterface)registry.lookup(JNDI_NAME);
        } catch (NotBoundException e) {
            Utils.shownError(TDSLanguageUtils.getMessage("Presupuesto.RMIError"));
            System.exit(0);
        } catch (RemoteException e) {
            Utils.shownError(TDSLanguageUtils.getMessage("Presupuesto.RMIError"));
            System.exit(0);
        } catch (Exception e) {
            Utils.shownError(TDSLanguageUtils.getMessage("Aplication.ExcpGeneral"));
            System.exit(0);
        }
    }
    
    
    
    
    
    
     public void conectarServerRMI() {
        try {
            Registry registry = LocateRegistry.getRegistry(URL,PORT);
            conexion = (GestorInterface)registry.lookup(JNDI_NAME);
        } catch (NotBoundException e) {
            Utils.shownError(TDSLanguageUtils.getMessage("Presupuesto.RMIError"));
            System.exit(0);
        } catch (RemoteException e) {
            Utils.shownError(TDSLanguageUtils.getMessage("Presupuesto.RMIError"));
            System.exit(0);
        } catch (Exception e) {
            Utils.shownError(TDSLanguageUtils.getMessage("Aplication.ExcpGeneral"));
            System.exit(0);
        }
    }
      public static void main(String args[]) {
        
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);            
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Principal.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                Principal p = new Principal();
				p.setSize(600,600);
                //p.setExtendedState(MAXIMIZED_BOTH);
                p.setVisible(true);
                p.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                
            }
        });
    }
    public static void showError(String paramString) {
        JOptionPane.showMessageDialog(null, paramString, "Error", 0);
    }

    public static void showMessage(String paramString1, String paramString2) {
        JOptionPane.showMessageDialog(null, paramString1, paramString2,1 );
    }
    
}
